#include <iostream>
#include <cstring>
#include <pthread.h>
#include <unistd.h>
#include <thread>
#include <cstring>
#include <vector>

int *p = nullptr;
void *threadrun(void*args)
{
    int a = 123;

    p = &a;

    while(true){sleep(1);}
}

int main()
{
    pthread_t tid;
    pthread_create(&tid,nullptr,threadrun,nullptr);
    while(true)
    {
        std::cout << "*p:" <<*p<<std::endl;
        sleep(1);
    }
    void*ret;
    pthread_join(tid,&ret);
    return 0;
}


// const int num = 10;
// void *routine(void *args)
// {
//     sleep(1);
//     std::string name = static_cast<const char *>(args);
//     pthread_t tid = pthread_self();
//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "我是新线程,我的名字是:" << name << std::endl;
//         sleep(1);
//     }
//     // std::cout << "我是新线程,我的名字是:" << name <<std::endl;
//     return (void *)100; // 暂时：线程退出时的退出码
// }
// int main()
// {

//     std::vector<pthread_t> tids;
//     for (int i = 0; i < num; i++)
//     {
//         sleep(1);
//         pthread_t tid;
//         char *id = new char[64];
//         snprintf(id, sizeof(id), "pthread-%d", i);
//         int n = pthread_create(&tid, nullptr, routine, id);
//         if (n == 0)
//         {
//             tids.push_back(tid);
//         }
//     }
//     for (int i = 0; i < num; i++)
//     {
//         // 一个一个等待,或者全部分离
//         int n = pthread_join(tids[i], nullptr);
//         if (n == 0)
//         {
//             printf("等待新线程%d成功\n", i);
//         }
//     }
//     return 0;
// }

// class Task
// {
// public:
//     Task(int a, int b)
//         : _a(a), _b(b)
//     {
//     }
//     int Execult()
//     {
//         return _a + _b;
//     }
//     ~Task()
//     {
//     }

// private:
//     int _a;
//     int _b;
// };
// class Result
// {
// public:
//     Result(int result)
//         : _result(result)
//     {
//     }
//     int GetResult()
//     {
//         return _result;
//     }
//     ~Result()
//     {
//     }

// private:
//     int _result;
// };
// int flag = 0;
// std::string FormatId(const pthread_t &tid)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%lx", tid);
//     return id;
// }
// void *threadrun(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     pthread_t tid = pthread_self();
//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "我是新线程,我的名字是:" << name << "我的id是："
//                   << FormatId(tid) << std::endl;
//         sleep(1);
//     }
//     return (void *)100; // 暂时：线程退出时的退出码
// }

// void showtid(const pthread_t &tid)
// {
//     printf("tid:%ld\n", tid);
// }

// //void* p:开辟空间的
// // void* routine(void *args)
// // {
// //     Task *t = static_cast<Task*> (args);
// //     sleep(100);

// //     Result * res=new Result(t->Execult());
// //     sleep(1);
// //     //return res;
// //     pthread_exit(res);
// //     std::cout << "新线程不应该输出此句话"<<std::endl;
// // }
// void* routine(void *args)
// {
//     //给自己设置分离
//     pthread_detach(pthread_self());
//     std::cout << "新线程主动分离" << std::endl;
//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "我是新线程" << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;
//     Task *t= new Task(10,20);
//     //int n = pthread_create(&tid, nullptr, routine, t);
//     int n = pthread_create(&tid, nullptr, routine, (void *)"thread_1");
//     // showtid(tid);
//     // int cnt = 10;
//     // while (cnt--)
//     // {
//     //     std::cout << "我是main," << "我的id是： " << FormatId(pthread_self())
//     //               << " flag：" << flag << std::endl;
//     //     sleep(1);
//     // }
//     //sleep(3);
//     //pthread_cancel(tid);
//     //pthread_detach(tid);

//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "我是main" << std::endl;
//         sleep(1);
//     }
//     n = pthread_join(tid,nullptr);
//     if(n != 0)
//     {
//         std::cout << "pthread_join error" << std::endl;
//     }
//     else
//     {
//         std::cout << "pthread_join success" << std::endl;
//     }
//     // void*ret = nullptr;
//     // pthread_join(tid,&ret);//pthread_join拿到的返回值，就是线程退出设定的返回值，默认线程无异常
//     // std::cout << "新线程结束，运行结果："<<(long long)ret<<std::endl;

//     // Result* ret = (Result*)routine(t);
//     // pthread_join(tid, (void**)&ret);
//     // std::cout << "ret:" << ret->GetResult() << std::endl;
//     // delete t;
//     // delete ret;
//     return 0;
// }

// void hello()
// {
//     while(true)
//     {
//         std::cout << "新线程：hello world, pid: " << getpid() << std::endl;
//         sleep(1);
//     }

// }
// int main()
// {
//     std::thread t(hello);
//     while(true)
//     {
//         std::cout << "我是主线程...,pid: " << getpid() <<std::endl;
//         sleep(1);
//     }
//     t.join();
//     return 0;
// }
// void *threadrun(void *args)
// {
//     std::string name = (const char *)args;
//     while (true)
//     {
//         std::cout << "我是新线程,我的名字是:" << name << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, (void *)"thread_1");
//     while (true)
//     {
//         std::cout << "我是主线程..." << std::endl;
//         sleep(1);
//     }
//     return 0;
// }